/*
 * ftp.cpp
 *
 *  Created on: 23 nov. 2011
 *      Author: arthur
 */

#include "ftp.h"

int openFTP(char * addr, char * login, char * mdp, int verbeux) {
	int sockfd; // descripteur de socket
	struct sockaddr_in serveur; // structure d'adresse qui contiendra les param reseaux du serveur

	// creation de la socket
	sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	// initialisation de la structure d'adresse du serveur :

	// famille d'adresse
	serveur.sin_family = AF_INET;

	// recuperation de l'adresse IPv4 du serveur
	inet_aton(addr, &(serveur.sin_addr));

	// recuperation du port du serveur
	serveur.sin_port = htons(21);

	// tentative de connexion
	if (connect(sockfd, (struct sockaddr *) &serveur, sizeof(serveur)) == -1) {
		perror("Erreur de connexion -> ");
		//exit(2);
	}

	int codeRetour = 0;
	char * buffer = malloc(512);
	
	printf("Debug : connexion tcp ok");

	//attente de la réponse
	recv(sockfd, buffer, 512, 0);
	codeRetour = (buffer[0] - '0') * 100 + (buffer[1] - '0') * 10 + (buffer[2]
			- '0');
	if (codeRetour == 220) {
		// Server connecté ok
		if (verbeux) {
			printf("Debug : msg hello reçu");
			printf("\n%s\n", buffer);
		} else {
			printf("Connection au serveur établie");
		}
		
		printf("Debug : envoi user\n");
		//envois des identifiants
		char * msgU = (char *) malloc((10 + strlen(login)) * sizeof(char));
		strcpy(msgU, "USER ");
		strcat(msgU, login);
		msgU[5 +strlen(login)] ='\r';
		msgU[6 +strlen(login)] ='\n';
		msgU[7 +strlen(login)] ='\0';

		int retourSend = send(sockfd, msgU, (7 + strlen(login)), 0);
		printf("debug : send : %d\n", retourSend);
		if ( retourSend == -1) {
			perror("Erreur lors de l'envois du nom d'utilisateur");
		}
		
		printf("Debug : user envoyé\n");
		//attente de la réponse
		recv(sockfd, buffer, 512, 0);
		printf("Debug : recv ok\n");
		codeRetour = (buffer[0] - '0') * 100 + (buffer[1] - '0') * 10
				+ (buffer[2] - '0');
		printf("Debug : réponse reçu code retour %d\n", codeRetour);
		if (codeRetour == 331) {
			if (verbeux) {
				printf("%s\n", buffer);
			}

			// envois du mot de passe
			char * msgP = (char *) malloc((6 + strlen(mdp)) * sizeof(char));
			strcpy(msgP, "PASS ");
			strcat(msgP, mdp);
			msgP[5 +strlen(mdp)] ='\r';
			msgP[6 +strlen(mdp)] ='\n';
			msgP[7 +strlen(mdp)] ='\0';
			if (send(sockfd, msgP, (7 + strlen(login)), 0) == -1) {
				perror("Erreur lors de l'envois du nom d'utilisateur\n");
			}
			//attente de la réponse
			recv(sockfd, buffer, 512, 0);
			printf("Debug : recv ok\n");
			codeRetour = (buffer[0] - '0') * 100 + (buffer[1] - '0') * 10
				+ (buffer[2] - '0');
			printf("Debug : réponse reçu code retour %d\n", codeRetour);
			if (codeRetour == 230) {
				if (verbeux) {
					printf("%s\n", buffer);
				}
			}else{
				printf("le mot de pass n'est pas valide\n");
				close(sockfd);
				sockfd = 0;
			}

		} else {
			printf("le nom d'utilisateur n'est pas valide\n");
			close(sockfd);
			sockfd = 0;
		}

	} else {
		perror("le serveur n'as pas renvoyer le code de retour prévu, il refuse la connexion \n");
		close(sockfd);
		sockfd = 0;
	}


	return sockfd;
}

char * cmdFTP(int socket, int cmd, char ** args, int nbArgs){
	/*struct sockaddr_in client; // structure d'adresse qui contiendra les param reseaux du client
	
	// creation de la socket
	sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

	// initialisation de la structure d'adresse du serveur :

	// famille d'adresse
	client.sin_family = AF_INET;

	client.sin_addr.s_addr = INADDR_ANY;

	// recuperation du port du serveur
	client.sin_port = htons(16458);
	
	if(bind(sockfd, (struct sockaddr *) &client, sizeof(client)) <0 ){
		printf("Erreure lors de l'ouverture d'un port local\n");
	}
	
	if(listen(client, 1)<0){
		printf("Erreure lors de l'écoute du port ouvert");
	}
	
	char * addrIPLocale = inet_ntoa(client.sin_addr);
	printf("notre addresse ip : %s", addrIPLocale);
	
	
	// envois de la commande port
	
	char * msgU = (char *) malloc((10 + strlen(addrIPLocale)) * sizeof(char));
	strcpy(msgU, "PORT ");
	strcat(msgU, addrIPLocale);
	msgU[5 +strlen(login)] ='\r';
	msgU[6 +strlen(login)] ='\n';
	msgU[7 +strlen(login)] ='\0';*/
	char truc[2];
	return truc;
}

void decoFTP(int socket, int verbeux)
{
	char * msgQuit = "QUIT \r\n\0";
	char reponse[MAX_SIZE_REPONSE_QUIT];
	int codeRetour;
	
	//Envoie du message "QUIT"
	if (send(socket, msgQuit, (strlen(msgQuit)+1), 0) == -1) 
	{
		perror("Erreur lors de l'envois de QUIT");
	}
	
	//attente de la réponse
	recv(socket, reponse, MAX_SIZE_REPONSE_QUIT, 0);
	codeRetour = (reponse[0] - '0') * 100 + (reponse[1] - '0') * 10
				+ (reponse[2] - '0');
	
	if (codeRetour == 221)
	{	
		if(verbeux)
		{
			printf("Reponse serveur : %s\n\n",reponse);
		}
	}
	else
	{
		perror("Le serveur n'as pas renvoyer le code de retour prévu (221) lors de l'envois de QUIT :\n\n\nDeconnexion forcée dans 3s.");
		sleep(3);
	}
	
	close(socket);
}

